/*****************************************************************************
  Copyright ?2002-2004 by Martin Cook. All rights are reserved. If you like
  this code then feel free to go ahead and use it. The only thing I ask is 
  that you don't remove or alter my copyright notice. Your use of this 
  software is entirely at your own risk. I make no claims about the 
  reliability or fitness of this code for any particular purpose. If you 
  make changes or additions to this code then please clearly mark your code 
  as yours. If you have questions or comments then please contact me at: 
  martin@codegator.com
  
  Have Fun! :o)
*****************************************************************************/


using System;
using System.Data;
using System.Security.Principal;
using System.Threading;

using CG.Security.Configuration;
using CG.Security.Data;

namespace CG.Security
{

	/// <summary>
	/// Provides static methods that supply helper utilities for managing 
	/// associations between roles and rights.
	/// </summary>
	public sealed class RoleRightManager
	{
		
		// ******************************************************************
		// Attributes.
		// ******************************************************************

		#region Attributes

		/// <summary>
		/// The data object used to interface with the database.
		/// </summary>
		private static IRoleRightData c_roleRightData;

		#endregion

		// ******************************************************************
		// Constructors.
		// ******************************************************************

		#region Constructors

		/// <summary>
		/// Class constructor.
		/// </summary>
		static RoleRightManager()
		{
			c_roleRightData = DataManager.RoleRightData;
		} // End RoleRightManager()

		#endregion

		// ******************************************************************
		// Public methods.
		// ******************************************************************

		#region Public methods

		/// <summary>
		/// Creates a new association between a role and a right.  Note that 
		/// the calling user must be a member of the 'Admin' role in order 
		/// to perform this action.
		/// </summary>
		/// <param name="roleID">The identifier for the role.</param>
		/// <param name="rightID">The identifier for the right.</param>
		public static void Create(
			int roleID,
			int rightID
			)
		{

			// Check the role of the user before we proceed.
			if (!Thread.CurrentPrincipal.IsInRole("Admin"))
				throw new SecurityException("User must be in the Admin role to perform this action!");

			// Create the association in the database.
			c_roleRightData.Create(
				roleID,
				rightID
				);

		} // End Create()

		// ******************************************************************

		/// <summary>
		/// Deletes an association between a role and a right.  Note that 
		/// the calling user must be a member of the 'Admin' role in order 
		/// to perform this action.
		/// </summary>
		/// <param name="roleID">The identifier for the role.</param>
		/// <param name="rightID">The identifier for the right.</param>
		public static void Delete(
			int roleID,
			int rightID
			)
		{

			// Check the role of the user before we proceed.
			if (!Thread.CurrentPrincipal.IsInRole("Admin"))
				throw new SecurityException("User must be in the Admin role to perform this action!");

			// Delete the association in the database.
			c_roleRightData.Delete(
				roleID,
				rightID
				);

		} // End Delete()

		// ******************************************************************

		/// <summary>
		/// Returns all the roles that are associated with a specified right.
		/// </summary>
		/// <param name="rightID">The identifier for the right.</param>
		/// <returns>A DataSet containing all the roles associated with the 
		/// specified right.</returns>
		public static System.Data.DataSet FindByRight(
			int rightID
			)
		{

			// Get the list of associations from the database.
			DataSet ds = c_roleRightData.FindByRight(
				rightID
				);

			// Ensure the dataset has a consistant name.
			ds.DataSetName = "RoleRightData";

			// Ensure the table has a consistant name.
			ds.Tables[0].TableName = "cg_security_role_right";

			return ds;

		} // End FindByRight()

		// ******************************************************************

		/// <summary>
		/// Returns all the rights that are associated with a specified role.
		/// </summary>
		/// <param name="rightID">The identifier for the role.</param>
		/// <returns>A DataSet containing all the rights associated with the 
		/// specified role.</returns>
		public static System.Data.DataSet FindByRole(
			int roleID
			)
		{

			// Get the list of associations from the database.
			DataSet ds = c_roleRightData.FindByRole(
				roleID
				);

			// Ensure the dataset has a consistant name.
			ds.DataSetName = "RoleRightData";

			// Ensure the table has a consistant name.
			ds.Tables[0].TableName = "cg_security_role_right";

			return ds;

		} // End FindByRole()

		#endregion

	} // End clas RoleRightManager

} // End namespace CG.Security
